看思维导图:一文带你学Verilog HDL语言 您所在的位置:网站首页 $setup verilog 看思维导图:一文带你学Verilog HDL语言

看思维导图:一文带你学Verilog HDL语言

2022-06-02 08:35| 来源: 网络整理| 查看: 265

[导读] 基于FPGA的SOC在嵌入式系统应用越来越广了,往往一个复杂系统使用一个单芯片基于FPGA的SOC就搞定了。比较流行的方案主要有Altera/xilinx两家的方案。要用这样的方案,首要需要掌握的是硬件描述语言。 最为流行的硬件描述语言有两种Verilog HDL/VHDL,均为IEEE标准。 Verilog HDL具有C语言基础就很容易上手,而VHDL语言则需要Ada编程基础。 另外 Verilog HDL 语言具有大量成熟的模块,从某种角度说Verilog HDL更具生命力。 本文整理了一下Verilog HDL语言技术要点,并分享给大家。 如发现有错误,欢迎留言指正。 Verilog HDL能干啥?

Verilog HDL的特点:

可描述顺序执行或并行执行的程序结构 用延迟表达式或事件表达式来明确地控制过程的启动时间 通过命令的事件来触发其他过程的激活行为或停止行为 提供了条件/循环等逻辑控制结构 提供了可带参数且非零延续时间的任务程序机构 提供了用于建立表达式的算术运算符、逻辑运算符和位运算符 实现了完整的表示组合逻辑基本元件的原语 提供了双向通路和电阻器的描述 可建立MOS器件的电荷分享和衰减模型 可通过结构性语句精确地建立信号模型

在学习Verilog HDL之前,先明确一下FPGA的设计抽象层次:

基本程序结构 module module_name(port_list)    //声明各种变量、信号    reg  //寄存器    wire //线网    parameter //参数    input  //输入信号    output //输出信号    inout  //输入输出信号    function //函数    task     //任务    ....            //程序代码    initial assignment    always assignment    module assignment    gate   assignment    UDP    assignment    continous assignmentendmodule

启示:描述的是模块,其本质是数字电路:

组合逻辑电路模块:组合逻辑电路的特点是输入的变化直接反映了输出的变化,其输出的状态仅取决于输入的当前的状态,与输入、输出的原始状态无关。

时序逻辑电路模块:时序电路具有记忆功能。时序电路的特点是:输出不仅取决于当时的输入值,而且还与电路过去的状态有关。时序逻辑电路又称时序电路,主要由存储电路和组合逻辑电路两部分组成。

数据类型及运算符 变量名

变量名类似C语言,以一组字母、数字、下划线和$符号的组合,且首字符须为字母或者下划线。如

input ctrl_1; 数据类型

将四种基本数据类型整理成一张导图:

其中须注意的是,对于memory型存储单元进行读写,须指定地址,如:

reg[15:0] addr; //定义addr为16位位宽的存储器变量addr = 1;       //okreg addr[15:0]; //定义addr为1位位宽的16个存储器变量addr    = 1;    //错误addr[0] = 1;    //正确//又如:reg[15:0] addr[3:1]; //定义3个位宽为16位存储器addr[1] = 16'h0      //16'指定位宽,h 表示16进制,0addr[2] = 16'b011    //b表示二进制

对于parameter变量的实用价值可读性比较好理解,那么可维护性怎么体现呢?

熟悉C语言编程的,联想一下宏,如果宏变了,有宏的地方全替换,这里parameter变量作用类似,如:

module Decode(A,F); parameter  Width=1, Polarity=1; …………… endmodule module  Top; wire[3:0] A4; wire[4:0] A5; wire[15:0] F16; wire[31:0] F32; Decode  #(4,0)  D1(A4,F16); Decode  #(5)    D2(A5,F32); Endmodule  常量

parameter定义常量,那么对于常数,整型常量即整常数有以下四种进制表示形式:

二进制整数(b或B) 十进制整数(d或D) 十六进制整数(h或H) 八进制整数(o或O)

数字表达方式有以下三种:

这是一种全面的描述方式。 在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位)。 在这种描述方式中,采用缺省进制十进制。 x和z值

在数字电路中,x代表不定值,z代表高阻值。不确定是啥?高阻又是啥?记住verilog描述的数字电路,那么对于一个模块的I/O就有可能是高阻,或者状态不确定。

负数:

一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。

-8'd7  //-号直接放在最前面8'd-7  //这样则不正确 实数

实数可用十进制方式表述或者科学计数法描述,如:

//十进制表示1.020.234//科学计数法表示6e-4 模块端口 input:模块从外界读取数据的接口,在模块内 可读不可写 output:模块向外部输出数据的接口,模块内部 可写不可读 inout:可读写数据,数据双向流动。

学习硬件描述语言,一定要时刻记住,这是描述的是电路,风格类C,但不是C!

表达式及运算符

和C语言类似,运算符也有三种:

单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。 二目运算符(binary operator):可以带二个操作数,操作数放在运算符的两边。 三目运算符(ternary operator):可以带三个操作,这三个操作数用三目运算符分隔开。

对于运算符,整理了一张导图:

大部分与C语言类似,除了等式运算符、位拼接运算符、缩减运算符,这里放点例子方便理解:

//缩减运算符reg [3:0] B; reg C; C = &B; //相当于: C =( (B[0]&B[1]) & B[2] ) & B[3];  //位拼接运算符{a,b[3:0],w,3’b101}//相当于: {a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1} 

运算符优先级:

赋值语句 非阻塞(Non_Blocking)赋值方式, 如 b


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有